home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Science⁄Math / Scientist's Helper src / s.helper.5 / regproc.c next >
C/C++ Source or Header  |  1986-02-05  |  3KB  |  101 lines

  1. #include "all.h"
  2. #include "regtabext.h"
  3.  
  4. ForCommand() /*procedure for loop*/
  5. {
  6.     int i, j, k;
  7.     
  8.     SToI( command.cmdWord[2], &i);
  9.     SToI( command.cmdWord[3], &j);
  10.     if (strlen(command.cmdWord[4])==0) {
  11.         strcpy(command.cmdWord[4],"1");
  12.         }
  13.     SToI( command.cmdWord[4], &k);
  14.     if ( (k==0) || ( (i<j) && (k<0) ) || ( (i>j) && (k>0) ) ) {
  15.         ErrMsg("bad parameters in for");
  16.         }
  17.     if (!SetVar( command.cmdWord[1], command.cmdWord[2] ) ) {
  18.         ErrMsg("couldnt create variable in for statement");
  19.         }
  20.     if (loops.numLoops < maxLoops) {
  21.         loops.lineNum[loops.numLoops] = mem.stack[mem.stackPtr];
  22.         strcpy( loops.varName[loops.numLoops], command.cmdWord[1] );
  23.         loops.endValue[loops.numLoops] = j;
  24.         loops.increment[loops.numLoops] = k;
  25.         loops.numLoops++;
  26.                      }
  27.     else {
  28.         ErrMsg("too many levels of for loops");
  29.         }
  30. }
  31.  
  32. NextCommand()
  33. {
  34.     int i, j, match;
  35.     char vVal[80], vNam[80];
  36.  
  37.     match = FALSE;
  38.     for( i=0;  i<maxLoops; i++ ) {                   
  39.         if( strcmp(command.cmdWord[1],loops.varName[i])==0) {                   
  40.             match = TRUE;
  41.             break;
  42.             }
  43.         }
  44.     if (!match) {
  45.         ErrMsg("next has no corresponding for");
  46.         }
  47.     strcpy( vNam, "@" );
  48.     strcat( vNam, command.cmdWord[1] );
  49.     match = GetVar( vNam, vVal );
  50.     if (!match) {
  51.         ErrMsg("couldnt find for loop variable");
  52.         }
  53.     SToI( vVal, &j );
  54.     j=j + loops.increment[i];
  55.     IToS( j, vVal );
  56.     if ( !SetVar(command.cmdWord[1], vVal) ) {
  57.         ErrMsg("couldnt set for loop variable");
  58.         }
  59.     if( ((loops.increment[i]>0) && (loops.endValue[i]<j)) ||
  60.          ((loops.increment[i]<0) && (loops.endValue[i]>j)) ) {
  61.             DelVar(command.cmdWord[1]);
  62.             if (i<(loops.numLoops-1)) {
  63.                 for (j=i+1; j<loops.numLoops; j++ ) {
  64.                     loops.lineNum[j-1]=loops.lineNum[j];
  65.                     strcpy(loops.varName[j-1],loops.varName[j]);
  66.                     loops.endValue[j-1] =loops.endValue[j];
  67.                     loops.increment[j-1] = loops.increment[j];
  68.                     } /*end  for*/
  69.                 } /*end if*/
  70.             loops.numLoops--;
  71.             }                   
  72.         else {                   
  73.             if (loops.lineNum[i] < (*prText)->nLines)  {
  74.                 mem.stack[ mem.stackPtr ] = loops.lineNum[i];
  75.                 }
  76.             else {
  77.                 ErrMsg("attempt to jump off end of procedure memory");
  78.                 }
  79.                      }
  80. }
  81.  
  82. ReturnCommand()
  83. {
  84.     int i, tempBoolean;
  85.     if (!mem.active) {
  86.         ErrMsg("cant return from console");
  87.         }    
  88.     else if (mem.stackPtr==0) { /*return to console*/
  89.         NoPendingInput();
  90.         mem.active = FALSE;
  91.         mem.stackPtr = -1;
  92.         for (i=0; i<loops.numLoops; i++ ) { /*delete any loop variables*/
  93.             tempBoolean = DelVar(loops.varName[i]);
  94.             }
  95.         loops.numLoops = 0;
  96.         }
  97.     else {    /*return to next level of subroutines*/
  98.         mem.stackPtr--;
  99.         }
  100. }
  101.